blog
简约儒略日与格里高利日期转换
在天文与航天计算中,经常需要在简约儒略日与格里高利日之间互相转化。 这里给出go语言代码,算法请参考sofa或海军天文台的novas。
package main
import (
"fmt"
"math"
)
func main(){
/*------------------------------------------------------
Created : Song Yezhi 2023-3-16 23:41
test for cal2jd and jd2cal
--------------------------------------------------------
Email : song.yz@foxmail.com
Copyrigt (C) : Chinese Academy of Sciences
All rights reserved, 2023
-------------------------------------------------------*/
var hour float64
year :=2023
month := 3
day := 16
hour = 0.0
mjd := cal2jd(year,month,day,hour)
fmt.Printf("2023 3 16 0.0 mjd = %f \n", mjd )
year,month,day ,hour= jd2cal(mjd )
fmt.Printf("trans back to cal = %d %d %d %f \n",year,month,day ,hour)
}
func cal2jd(year ,month,day int ,hour float64)(mjd float64){
/*------------------------------------------------------
Created : Song Yezhi 2023-3-16 22:39
Gregorian Calendar to Modified Julian Date.
Referenc : cal2jd.for in SOFA
--------------------------------------------------------
Input Parameters :
Output Parameters :
--------------------------------------------------------
Email : song.yz@foxmail.com
Copyrigt (C) : Chinese Academy of Sciences
All rights reserved, 2023
-------------------------------------------------------*/
var MJD int
MJD = day-32075+1461*(year+4800+(month-14)/12)/4+
367*(month-2-(month-14)/12*12)/12-3*((year+4900+(month-14)/12)/100)/4
mjd = float64(MJD) -0.5 + hour/24.0 -2400000.5
return
}
func jd2cal(TJD float64) (year,month,day int, hour float64){
/*------------------------------------------------------
Created : Song Yezhi 2023-3-16 22:52
* THIS SUBROUTINE COMPUTES CALENDAR DATE AND TIME, GIVEN JULIAN
* DATE. INPUT JULIAN DATE CAN BE BASED ON ANY UT-LIKE TIME SCALE
* (UTC, UT1, TT, ETC.) - OUTPUT TIME VALUE WILL HAVE SAME BASIS.
* OUTPUT CALENDAR DATE WILL BE GREGORIAN. ALGORITHM BY FLIEGEL AND
* VAN FLANDERN.
Referenc : CALDAT in NOVAS_F3.1.f
* DJ1 DJ2
*
* 2450123.7D0 0D0 (JD method)
* 2451545D0 -1421.3D0 (J2000 method)
* 2400000.5D0 50123.2D0 (MJD method)
* 2450123.5D0 0.2D0 (date & time method)
--------------------------------------------------------
Input Parameters :
Output Parameters :
--------------------------------------------------------
Email : song.yz@foxmail.com
Copyrigt (C) : Chinese Academy of Sciences
All rights reserved, 2023
-------------------------------------------------------*/
TJD = TJD + 2400000.5
DJD := TJD +0.5
var JD ,L,N int
JD = int(DJD)
hour = math.Mod(DJD, 1.0)*24.0
L = JD+68569
N = 4*L/146097
L = L - (146097*N+3)/4
year = 4000*(L+1)/1461001
L = L - 1461* year/4 + 31
month = 80*L/2447
day = L - 2447* month/80
L = month / 11
month = month + 2 -12*L
year = 100*(N-49) + year + L
return
}
输出结果如下
2023 3 16 0.0 mjd = 60019.000000 trans back to cal = 2023 3 16 0.000000